home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dvitovdu / unix / c / pkreader.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  6KB  |  264 lines

  1. /* This module allows dvi2vdu to use packed (PK) font format files*/
  2. /* by creating a temporary PXL file from the PK file */
  3. /* The conversion is done by the existing utility pktopx */
  4.  
  5. /* Marc Hadley.  Kernel Technology Limited.  June 1989 */
  6.  
  7. #include "def.h"
  8.  
  9. static char *sccsid[] = "@(#)pkreader.c    1.1";
  10.  
  11. #define MAXPATHLEN 80
  12.  
  13. #ifndef TEMPAREA
  14. #define TEMPAREA "/tmp"
  15. #endif /* TEMPAREA */
  16.  
  17. #ifndef BSD_FILESYSTEM
  18.  
  19. static short tmpdirmade = FALSE;
  20. static char targetPXLdir[MAXPATHLEN+1];
  21.  
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24.  
  25. #endif /* BSD_FILESYSTEM */
  26.  
  27. extern int pktopx();
  28. extern stringvalue fontdir;
  29.  
  30. FILE * ConvertPKfile ();
  31. int   MakePKname ();
  32. void exitprog ();
  33.  
  34. typedef struct anode
  35. {
  36.   char *name;
  37.   struct anode *next;
  38. } node, *pnode;
  39.  
  40. pnode firstfont = NULL;
  41.  
  42. FILE * ConvertPKfile (fontname)
  43. char  fontname[];
  44. {
  45.   char  sourcePKfile[MAXPATHLEN + 1],
  46.         sourcePKpath[MAXPATHLEN + 1],
  47.         targetPXLpath[MAXPATHLEN + 1];
  48.   char  dummy[11];
  49.   FILE * pkfiletest, *pxlfiletest, *fp;
  50.   char *argarr[3];
  51.   pnode temp;
  52.  
  53.   if (MakePKname (fontname, sourcePKfile))
  54.     return (NULL);        /* Error in filename */
  55.  
  56. #ifdef PXLAREA
  57.  /* search for pxl file first */
  58.   (void) sprintf (targetPXLpath, "%s/%s", PXLAREA, fontname);
  59.   pxlfiletest = fopen (targetPXLpath, "r");
  60.   if (pxlfiletest != NULL)
  61.     return pxlfiletest;
  62. #endif
  63.  
  64.  /* Must create a PXL file from a PK file */
  65.  
  66.  /* Make pathnames for PK file and temporary PXL file.  If we're lucky */
  67.  /* and have a BSD filesystem supporting long filenames, append the    */
  68.  /* process id to the temp filename to ensure uniqueness.  Otherwise,  */
  69.  /* assume a 14 character filename limit and create a temporarary      */
  70.  /* directory in TEMPAREA in which the PXL files will be created.      */
  71.  /* NOTE that the original idea was that multiple users would be able  */
  72.  /* use each others pre-created fonts, but with strict default         */
  73.  /* permissions, and in a few obscure circumstances, this makes for    */
  74.  /* more trouble that it is worth.                                     */
  75.  
  76. #ifdef BSD_FILESYSTEM
  77.   (void) sprintf (targetPXLpath, "%s/%s.%d", TEMPAREA, fontname, getpid());
  78.                   /* Add PID suffix to ensure uniqueness */
  79. #else /* USG_FILESYSTEM */
  80.   if(!tmpdirmade)
  81.       (void) mktmpdir("%s/pxlfonts.%d", TEMPAREA, getpid());
  82.   (void) sprintf(targetPXLpath, "%s/pxlfonts.%d/%s",
  83.           TEMPAREA, getpid(), fontname);
  84. #endif /* BSD_FILESYSTEM */
  85.   
  86.   (void) sprintf (sourcePKpath, "%s/%s", fontdir, sourcePKfile);
  87.  
  88.  /* check if pxl file has already been created */
  89.   pxlfiletest = fopen (targetPXLpath, "r");
  90.   if (pxlfiletest != NULL)
  91.     return pxlfiletest;
  92.  
  93.  /* Check if source file exists */
  94.   pkfiletest = fopen (sourcePKpath, "r");
  95.   if (pkfiletest == NULL)
  96.     return (NULL);
  97.   else
  98.     (void) fclose (pkfiletest);
  99.  
  100.  /* Create temporary PXL file */
  101.   (void) strcpy (dummy, "pktopx");
  102.   argarr[0] = dummy;
  103.   argarr[1] = sourcePKpath;
  104.   argarr[2] = targetPXLpath;
  105.  
  106.   (void) pktopx (3, argarr);
  107.  
  108.  /* Save name so PXL file can be deleted later */
  109.   if ((temp = (pnode) malloc (sizeof (node))) == NULL)
  110.   {
  111.     (void) fprintf (stderr, "dvi2vdu: out of memory");
  112.     exitprog (-1);
  113.   }
  114.   temp->next = firstfont;
  115.   temp->name = malloc ((unsigned)(strlen (argarr[2]) + 1));
  116.   if (temp->name == NULL)
  117.   {
  118.     (void) fprintf (stderr, "dvi2vdu: out of memory");
  119.     exitprog (-1);
  120.   }
  121.   (void) strcpy (temp->name, argarr[2]);
  122.   firstfont = temp;
  123.  
  124.  /* open new file and return handle */
  125.   fp = fopen (argarr[2], "r");
  126.   return (fp);
  127. }
  128.  
  129. int   MakePKname (pxlname, pkname)
  130. char *pxlname, *pkname;
  131. {
  132.   char *pf, *pk;
  133.   int   XXXX;
  134.  
  135.  /* pxl file has name in the form fontname.XXXXpxl */
  136.  /* extract XXXX from name */
  137.   pf = pxlname;
  138.  
  139.   while (*pf != '.' && *pf != '\0')
  140.     *pf++;
  141.  
  142.   if (*pf == '.')
  143.     *pf++;
  144.   else
  145.     return 1;
  146.  
  147.   (void) sscanf (pf, "%d", &XXXX);
  148.  
  149.  /* create PK file name from pxlname */
  150.   pf = pxlname;
  151.   pk = pkname;
  152.   while (*pf != '.')
  153.   {
  154.     *pk++ = *pf++;
  155.   }
  156.   (void) sprintf (pk, ".%dpk", (int) (XXXX / 5.0 + 0.5));
  157.  
  158.   return 0;
  159. }
  160.  
  161. void PurgeFonts ()
  162. {
  163.   pnode temp;
  164.   while ((temp = firstfont) != NULL)
  165.   {
  166.     firstfont = firstfont->next;
  167.     (void) unlink (temp->name);
  168.     (void) free (temp->name);
  169.     (void) free ((char *)temp);
  170.   }
  171. }
  172.  
  173.  
  174. void exitprog (i)
  175. int   i;
  176. {
  177.   int r_stat;
  178.     
  179.   PurgeFonts ();
  180.  
  181. #ifndef BSD_FILESYSTEM
  182.   if(tmpdirmade)
  183.       if((r_stat = rmdir(targetPXLdir)) != 0)
  184.       perror(targetPXLdir);
  185. #endif /* BSD_FILESYSTEM */
  186.  
  187.   exit (i);
  188. }
  189.  
  190.  
  191. #ifndef BSD_FILESYSTEM
  192.  
  193. #ifndef S_IRWXO
  194. #define S_IRWXO ((unsigned) (S_IREAD | S_IWRITE | S_IEXEC))
  195. #endif /* S_IRWXO */
  196.  
  197. #ifndef S_IRWXG
  198. #define S_IRWXG (S_IRWXO >> 3)
  199. #endif /* S_IRWXG */
  200.  
  201. #ifndef S_IRWXU
  202. #define S_IRWXU (S_IRWXO >> 6)
  203. #endif /* S_IRWXU */
  204.  
  205. mktmpdir (fmt, temparea, pid)
  206. char    *fmt,
  207.     *temparea;
  208. int    pid;
  209. {
  210.     (void) sprintf (targetPXLdir, fmt, temparea, pid);
  211.     if ( mkdir (targetPXLdir, S_IRWXU|S_IRWXG|S_IRWXO) < 0 )
  212.         exitprog (1);
  213.     tmpdirmade = TRUE;
  214.     return;
  215. }
  216.  
  217.  
  218. #ifdef NO_DIRCALLS
  219.  
  220. /* Simulate BSD and V.3 mkdir(2) amd rmdir(2) using system(3) rather than
  221.    mknod(2) and link(2) to avoid need for privilege in this program.
  222. */
  223.  
  224. int mkdir(path, mode)
  225. char *path;
  226. int mode;
  227. {
  228.     char cmdbuf[128];
  229.  
  230.     strcpy(cmdbuf, "mkdir ");
  231.     strcat(cmdbuf, path);
  232.  
  233. #ifdef DEBUG
  234.     printf("Creating <%s>\n", cmdbuf);
  235.     sleep(2);
  236. #endif /* DEBUG */
  237.     
  238.     if(system(cmdbuf) < 0)
  239.     return -1;
  240.     return chmod(path, mode);
  241. }
  242.  
  243.  
  244. int rmdir(path)
  245. char *path;
  246. {
  247.     char cmdbuf[128];
  248.     
  249.     strcpy(cmdbuf, "rmdir ");
  250.     strcat(cmdbuf, path);
  251.  
  252. #ifdef DEBUG
  253.     printf("Removing <%s>\n", cmdbuf);
  254.     sleep(2);
  255. #endif /* DEBUG */
  256.     
  257.     return system(cmdbuf);
  258.     
  259. }
  260.  
  261. #endif /* NO_DIRCALLS */
  262.  
  263. #endif /* BSD_FILESYSTEM */
  264.